﻿using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data.Objects;
using System.Linq;
using System.Windows.Data;
using WPFDataModel.DataModel;


namespace WPFDataModel.ViewModel
{
    /// <summary>
    /// Gibt die Auflistung für die Categories frei und bietet alle relevanten Funktionen für den Umgang mit Categories an.
    /// </summary>
    public class CategoryViewModel : NotifyPropertyChangedBase
    {
        #region Static Variables
        private static CategoryViewModel m_categoryViewModel;
        /// <summary>
        /// Gibt eine Instant von CategoryViewModel zurück (Singleton)
        /// </summary>
        public static CategoryViewModel GetCategoryViewModel()
        {
            if (m_categoryViewModel == null)
            {
                m_categoryViewModel = new CategoryViewModel();
            }

            return m_categoryViewModel;
        }
        #endregion

        #region Member Variables
        private ObjectSet<Category> m_categoriesObjectSet;
        private ListCollectionView m_categories;
        #endregion

        #region Propertys
        /// <summary>
        /// Beinhaltet die aktuell geclonte Kategorie
        /// </summary>
        //private Category CurrentClonedCategory { get; set; }
        
        /// <summary>
        /// Das Property existiert nur damit eine verkürtzte Schreibweise existiert um auf das CategorySet zuzugreifen.
        /// </summary>
        public ObjectSet<Category> CategoriesObjectSet
        {
            get { return m_categoriesObjectSet; }
            private  set { m_categoriesObjectSet = value; }
        }

        /// <summary>
        /// ListViewCollection wird z.B. benötigt um herauszufinden welches Item ausgewählt wurde
        /// </summary>
        public ListCollectionView Categories
        {
            get { return m_categories; }
            set
            {
                m_categories = value;
                OnPropertyChanged(System.Reflection.MethodBase.GetCurrentMethod().Name);
            }
        }

        /// <summary>
        /// Gibt die aktuell ausgewählte Kategorie zurück
        /// </summary>
        /// <returns>die aktuell ausgewählte Kategorie</returns>
        public Category CurrentCategory()
        {
            if (m_categories.CurrentItem != null)
            {
                return (Category)m_categories.CurrentItem;
            }

            //Wenn noch keine existiert wird eine neue zurück gegeben
            return new Category();
        }
        #endregion

        #region Contructors
        /// <summary>
        /// Private Constructor damit nur das
        /// </summary>
        public CategoryViewModel()
        {
            //Es gibt 2 Listen einmal die Liste für die DB und dann noch die Liste für die Anzeige, um z.B. Selected Item herauszubekommen

            //Das aktuelle Categories Object aus der DB, wird benötigt um DB Operationen durchzuführen
            CategoriesObjectSet = DataConnection.GetDataConnection().DataModel.CategorySet;
            //Die Collection wird zur Anzeige verwendet um MVVM Pattern umsetzten zu können.
            Categories =  new ListCollectionView(CategoriesObjectSet.ToList());
        }
        #endregion

        #region Public Functions
        /// <summary>
        /// Anlegen bzw. Speichern der übergebenen Kategorie
        /// </summary>
        public void SaveCategory()
        {
            DataConnection.GetDataConnection().DataModel.SaveChanges();
        }

        /// <summary>
        /// Anlegen bzw. Speichern der übergebenen Kategorie
        /// </summary>
        /// <param name="category">Category die erstellt bzw. gespeichert werden soll.</param>
        public void AddCategory(Category category)
        {
            //Im editmode kann auch das Add doppelt aufgerufen werden, hat dann aber schon eine Id und daher das Element nur speichern.
            if (category.Id == 0)
            {
                DataConnection.GetDataConnection().DataModel.AddToCategorySet(category);
                Categories.AddNewItem(category);
            }

            DataConnection.GetDataConnection().DataModel.SaveChanges();
        }

        /// <summary>
        /// Löscht die ausgewählten Kategorien
        /// </summary>
        public void DeleteSelectedCategories()
        {
            //Alle Elemente heruassuchen die gelöscht werden sollen, wenn Multiselect eingeschalten wäre (nur BeispielCode
            //var del = from eDel in CategoriesObjectSet where eDel.IsSelected == true select eDel;
            //foreach (Category eCategory in del)
            //{
            //    //Achtung muss in beiden Listen gelöscht werden.
            //    CategoriesObjectSet.DeleteObject(eCategory);
            //    Categories.Remove(eCategory);
            //}
            
            //Löschen der aktuellen Kategorie aus unserem ObjectSet und auch unserer Liste die auf der Oberfläche genutzt wird!
            CategoriesObjectSet.DeleteObject(CurrentCategory());
            Categories.Remove(CurrentCategory());
            //Speichern der Änderungen.
            DataConnection.GetDataConnection().DataModel.SaveChanges();
        }
        #endregion

        #region Private Functions
        #endregion
    }
}
